跳到主要内容

containerd 自建容器仓库

containerd 是一个容器运行时,它提供了管理容器生命周期的基础功能。要自建容器仓库,你可以使用 HarborNexusArtifactory 或其他容器仓库软件。

以下是使用 Harbor 作为例子的一种方法:

安装 Harbor

1、下载 Harbor 的离线安装包:

wget https://github.com/goharbor/harbor/releases/download/v2.9.0/harbor-offline-installer-v2.9.0.tgz

2、解压安装包:

tar xvf harbor-offline-installer-v2.9.0.tgz

3、进入解压后的目录,编辑 harbor.yml 文件,根据你的需要配置相关参数。

直接复制 harbor.yml.tmpl 文件为 harbor.yml 文件:

4、执行安装脚本:

sudo ./install.sh

配置 containerd

要使 containerd 能够从你的私有仓库拉取镜像,你需要在 containerd 的配置文件中添加你的私有仓库。

1、编辑 containerd 配置文件,通常位于 /etc/containerd/config.toml

sudo vim /etc/containerd/config.toml

2、在配置文件中添加你的私有仓库,例如:

[plugins."io.containerd.grpc.v1.cri".registry.configs."myregistry.example.com"]
[plugins."io.containerd.grpc.v1.cri".registry.configs."myregistry.example.com".auth]
username = "<your-username>"
password = "<your-password>"

3、重新启动 containerd 以应用更改:

sudo systemctl restart containerd

4、现在你应该可以从你的私有仓库拉取镜像了。

K3s 配置私有仓库

K3s 是通过修改 registries.yaml 文件

sudo vim /etc/rancher/k3s/registries.yaml
mirrors:
"k8s.gcr.io":
endpoint:
- "https://lank8s.cn"
- "https://k8s.lank8s.cn"
"gcr.io":
endpoint:
- "https://gcr.lank8s.cn"
"ghcr.io":
endpoint:
- "https://ghcr.lank8s.cn"
"registry.k8s.io":
endpoint:
- "https://registry.lank8s.cn"
"docker.io":
endpoint:
- "https://------.mirror.aliyuncs.com"
- "https://registry-1.docker.io"
"mycustomreg:5000":
endpoint:
- "http://mycustomreg:5000"
configs:
"mycustomreg:5000":
auth:
username: xxxxxx # this is the registry username
password: xxxxxx # this is the registry password
tls:
cert_file: # path to the cert file used in the registry
key_file: # path to the key file used in the registry
ca_file: # path to the ca file used in the registry

如果没有 TLS 通信,你需要为端点指定 http://,否则将默认为 https

配置完后重启一下 k3s

sudo systemctl restart k3s

他会被更新到下面的配置文件里面

/var/lib/rancher/k3s/agent/etc/containerd/config.toml

imagePullSecrets 自动设置私有库

因为每个 Agent 节点的运行时都是独立的,所以需要单独配置私有库的认证信息,这样每个节点都需要配置一遍,这样就很麻烦,所以可以使用 imagePullSecrets 来自动设置。Docker 或 containerd 运行时都可以使用

然而,Kubernetes 提供了一种更加集中和自动化的方式来处理私有镜像的凭据,即使用 ImagePullSecrets。这样您就不需要在每个节点上单独配置凭据。这是如何工作的:

1、创建一个 Secret:首先,在 Kubernetes 集群中创建一个类型为 docker-registry 的 Secret 对象,这个 Secret 将包含访问私有镜像仓库所需的用户名和密码。

kubectl create secret docker-registry myregistrykey \
--docker-server=DOCKER_REGISTRY_SERVER \
--docker-username=DOCKER_USER \
--docker-password=DOCKER_PASSWORD \
--docker-email=DOCKER_EMAIL

2、配置 Pod 使用 Secret:在部署应用程序时,在 Pod 的定义中引用这个 Secret。在 Pod 的 spec 中,添加 imagePullSecrets 字段,并指定您之前创建的 Secret。

apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: myapp-container
image: my-private-registry.com/myapp
imagePullSecrets:
- name: myregistrykey

3、自动化镜像拉取:上面配置了 imagePullSecrets 后,Kubernetes 将自动拉取私有镜像仓库中的镜像。但是每次都需要在 Pod 的定义中添加 imagePullSecrets 字段,这样就很麻烦,所以可以设置成全局的配置,这样就不需要每次都添加了。

在 Kubernetes 中,Pod 通常与一个 Service Account 关联。你可以将这个 Secret 添加到 Service Account,这样由该 Service Account 创建的所有 Pod 都会自动使用这个 Secret 来拉取镜像。

找到默认的 Service Account(通常叫做 default)或者任何你想要添加 Secret 的 Service Account:

kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}'

注意,每个命名空间下的 Service Account 都是独立的,所以如果你想要在多个命名空间下使用这个 Secret,你需要在每个命名空间下都添加一次。

如果觉得上面的方法太麻烦,可以直接在每个 Agent 节点的 /etc/rancher/k3s/registries.yaml 文件中添加 configs 配置,这样就不需要每个 Pod 都添加 imagePullSecrets 字段了。

# 最后重启 Agent
sudo systemctl restart k3s-agent

使用 TLS

[plugins.cri.registry.configs."my.custom.registry".tls]
insecure_skip_verify = true

测试推送

containerd 是一个容器运行时,它负责运行容器并管理容器的生命周期。然而,containerd 本身并不提供构建或推送镜像的功能。这些任务通常由其他工具来完成,比如 Dockerbuildkit

首先在 Harbor 中创建一个项目,例如 testproject,然后创建一个仓库,例如 my-nginx

这里编写一个简单的 Dockerfile 文件,用于构建一个简单的 nginx 镜像:

FROM nginx:latest
RUN echo "Hello World!" > /usr/share/nginx/html/index.html

推送到私有仓库:

# 先登录
docker login myregistry.example.com

docker build -t myregistry.example.com/testproject/my-nginx:v1 .
docker push myregistry.example.com/testproject/my-nginx:v1

如果使用 http

默认情况下,Docker 会使用 HTTPS 来与 Docker 仓库通信以确保安全。但是,在一些场景中,你可能需要让 Docker 通过 HTTP 来拉取或推送镜像,特别是在本地或私有网络中运行的 Docker 仓库。

要配置 Docker 以使用 HTTP,你需要更新 Docker 的守护程序配置并添加你的仓库地址到 “不安全注册表” 列表中。下面是如何在 Linux 系统上进行配置的步骤:

编辑 Docker 守护程序配置文件: 打开或创建 /etc/docker/daemon.json 文件。

添加不安全注册表配置:

在 daemon.json 文件中,添加你的 HTTP 仓库地址到 insecure-registries 数组中。例如:

{
"insecure-registries" : ["myregistrydomain.com:5000"]
}

重启服务

sudo systemctl restart docker

使用 BuildKit 构建和推送镜像

BuildKit 是一个现代化的容器镜像构建工具,它可以直接与 containerd 集成。以下是使用 BuildKit 构建和推送镜像的步骤:

以从 BuildKit 的 GitHub 仓库 获取安装说明。

buildkitd &

构建并推送镜像:

buildctl build \
--frontend dockerfile.v0 \
--local dockerfile=. \
--local context=. \
--output type=image,name=myregistrydomain.com/myimage:mytag,push=true

在这个命令中,myregistrydomain.com/myimage:mytag 是你想要推送到的仓库的地址和镜像的标签。dockerfile=context= 参数指向你的 Dockerfile 和构建上下文的位置。

如果需要认证,可以使用 --export-cache--import-cache 选项来指定认证信息。

配置内网域名解析

TODO: 未完成

References